package storetest.service;

import storetest.entry.Store;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;

public class Function {
    static Set<Store> set = new TreeSet<>();//创建商品
    static Scanner sc = new Scanner(System.in);//创建扫描器
    static List<Store> list = new ArrayList<>();//创建购物车
    static FileReader fr = null;
    static FileWriter fw = null;

    static {
        set.add(new Store(1111, "蜘蛛王皮鞋", 238.0, "黑色", 42, 100000));
        set.add(new Store(3333, "ThinkPadx240", 5939.0, "黑色", 12, 50));
        set.add(new Store(2222, "iphone15plus", 7999.0, "白色", 5, 5000));
    }

    //添加商品
    public static void storeAdd() {
        System.out.println("请输入商品编号：");
        Integer id = sc.nextInt();
        System.out.println("请输入商品名称：");
        String name = sc.next();
        System.out.println("请输入商品价格：");
        Double price = sc.nextDouble();
        System.out.println("请输入商品颜色：");
        String color = sc.next();
        System.out.println("请输入商品尺寸：");
        Integer size = sc.nextInt();
        System.out.println("请输入商品数量：");
        Integer num = sc.nextInt();
        //如果商品id存在，则添加失败
        if (isExist(id)) {
            System.out.println("添加失败，商品已存在");
            return;
        }
        set.add(new Store(id, name, price, color, size, num));
    }

    //查询商品
    public static void storeQuery() {
        System.out.println("编号\t\t名称\t\t价格\t\t颜色\t\t尺寸\t\t数量");
        for (Store store : set) {
            System.out.println(store.getId() + "\t" + store.getName() + "\t" + store.getPrice() + "\t" + store.getColor() + "\t" + store.getSize() + "\t" + store.getNum());
        }
    }

    //查看指定编号商品
    public static void storeQueryById() {
        System.out.println("请输入商品编号：");
        Integer id = sc.nextInt();
        for (Store store : set) {
            if (store.getId().equals(id)) {
                System.out.println("编号\t\t名称\t\t价格\t\t颜色\t\t尺寸\t\t数量");
                System.out.println(store.getId() + "\t" + store.getName() + "\t" + store.getPrice() + "\t" + store.getColor() + "\t" + store.getSize() + "\t" + store.getNum());
                return;
            }
        }
        System.out.println("没有此商品");
    }

    //检测商品是否存在
    private static boolean isExist(Integer id) {
        for (Store store : set) {
            if (store.getId().equals(id)) {
                return true;
            }
        }
        return false;
    }

    //添加到购物车
    public static void storeAddToCar() {
        System.out.println("请输入商品编号：");
        Integer id = sc.nextInt();
        if (isExist(id)) {//判断商品存在
            System.out.println("请输入商品数量：");
            Integer num = sc.nextInt();
            for (Store store : set) {//遍历取值
                if (store.getId().equals(id) && store.getNum() > num) {//库存足够
                    System.out.println("您要添加到购物车的信息为：");
                    System.out.println("编号\t\t名称\t\t价格\t\t颜色\t\t尺寸\t\t数量");
                    System.out.println(store.getId() + "\t" + store.getName() + "\t" + store.getPrice() + "\t" + store.getColor() + "\t" + store.getSize() + "\t" + num);
                    System.out.println("是否添加到购物车？1.是 其他键否");
                    int choice = sc.nextInt();
                    if (choice == 1) {//添加
                        // 检查购物车是否已有
                        boolean flage = false;
                        for (Store cartItem : list) {
                            if (cartItem.getId().equals(id)) {
                                cartItem.setNum(cartItem.getNum() + num);
                                flage = true;
                                break;
                            }
                        }
                        if (!flage) {
                            list.add(new Store(store.getId(), store.getName(), store.getPrice(),
                                    store.getColor(), store.getSize(), num));
                            System.out.println("添加成功");
                            return;
                        }
                    } else return;
                } else if (store.getId().equals(id) && store.getNum() < num) {//库存不足
                    System.out.println("商品库存不足");
                    return;
                }
            }
        }
        System.out.println("没有此商品");

    }

    //查看购物车
    public static void storeShowCar() {
        System.out.println("编号\t\t商品名称\t\t商品价格\t\t数量\t\t小计");
        //创建小计
        double total = 0;
        for (Store store : list) {
            System.out.println(store.getId() + "\t" + store.getName() + "\t" + store.getPrice() + "\t" + store.getNum() * store.getPrice() + "\t" + store.getNum());
            total += store.getNum() * store.getPrice();
        }
        System.out.println("总价：" + total);
    }

    // 导出为SQL文件
    public static void exportToSQL() {
        // 定义导出的 SQL 文件路径
        File file = new File("D:/data/store.sql");
        // 确保目录存在
        file.getParentFile().mkdirs();

        try (FileWriter fw = new FileWriter(file);
             BufferedWriter bw = new BufferedWriter(fw)) {

            // 写入 SQL 头部说明
            bw.write("-- 商品数据导出文件");
            bw.newLine();
            bw.write("-- 生成时间: " + new Date());
            bw.newLine();
            bw.write("USE your_database_name; -- 请替换为你的数据库名");
            bw.newLine();
            bw.write("INSERT INTO store (id, name, price, color, size, num) VALUES");
            bw.newLine();

            // 遍历商品集合
            Iterator<Store> iterator = set.iterator();
            while (iterator.hasNext()) {
                Store store = iterator.next();
                // 拼接 SQL 值（注意字符串加引号，数值不加）
                String line = String.format(
                        "    (%d, '%s', %.1f, '%s', %d, %d)%s",
                        store.getId(),
                        store.getName(),
                        store.getPrice(),
                        store.getColor(),
                        store.getSize(),
                        store.getNum(),
                        iterator.hasNext() ? "," : ";"  // 最后一行用分号结束
                );
                bw.write(line);
                bw.newLine();
            }

            System.out.println("✅ 数据已成功导出到: " + file.getAbsolutePath());

        } catch (IOException e) {
            System.err.println("❌ 文件导出失败！");
            e.printStackTrace();
        }
    }

    // 导出为CSV文件
    public static void exportToCSV() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入导出文件的完整路径（例如：D:/data/store.csv）：");
        String path = sc.nextLine().trim();

        // 如果用户没输入，给个默认值
        if (path.isEmpty()) {
            path = "store.csv";
        }

        File file = new File(path);
        // 创建父目录（如果不存在）
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }

        try (
                // 关键：指定 UTF-8 编码，并且让 Excel 能正确识别中文
                OutputStreamWriter osw = new OutputStreamWriter(
                        new FileOutputStream(file),
                        StandardCharsets.UTF_8
                );
                BufferedWriter bw = new BufferedWriter(osw)
        ) {
            // 写入 BOM（Byte Order Mark），让 Excel 正确识别 UTF-8 中文
            bw.write('\uFEFF'); // 这是 UTF-8 BOM，专为 Excel 准备

            // 写入 CSV 头部
            bw.write("编号,名称,价格,颜色,尺寸,库存数量");
            bw.newLine();

            // 遍历商品数据
            for (Store store : set) {
                // 注意：字符串字段如果有逗号、引号、换行，需要加双引号包裹
                String name = escapeCSVField(store.getName());
                String color = escapeCSVField(store.getColor());

                String line = String.format(
                        "%d,%s,%.2f,%s,%d,%d",
                        store.getId(),
                        name,
                        store.getPrice(),
                        color,
                        store.getSize(),
                        store.getNum()
                );
                bw.write(line);
                bw.newLine();
            }

            System.out.println("✅ CSV 文件已成功导出到：\n" + file.getAbsolutePath());

        } catch (IOException e) {
            System.err.println("❌ 文件导出失败！可能是路径错误或无写入权限。");
            e.printStackTrace();
        }
    }

    // 工具方法：处理 CSV 特殊字符（逗号、引号、换行）
    public static String escapeCSVField(String field) {
        if (field == null) return "";
        if (field.contains(",") || field.contains("\"") || field.contains("\n")) {
            // 包含特殊字符，需要用双引号包裹，并转义内部的双引号
            return "\"" + field.replace("\"", "\"\"") + "\"";
        }
        return field;
    }
}

